Crawling 5조 - 정성용, 여영웅
from IPython.display import Image
# 네이버 우리동네판(지역별로 구분하여 크롤링)
Image("0.png")
# 네이버 우리동네판의 일간 베스트 콘텐츠 : 지역 별로 제목, 링크 크롤링
Image("1.png")
# 콘텐츠 항목 별 블로그 : 날짜 크롤링
Image("8.png")
# 블로그의 세부 데이터 참조하는 경로 : 좋아요 갯수 크롤링
#(블로그에서 좋아요 갯수를 이 경로에서 참조하기 때문에 블로그에선 좋아요 갯수 크롤링 불가능)
Image("9.png")
%%writefile naver.py
# 모듈 생성
# 1) 필요한 기능 import
from fake_useragent import UserAgent
from selenium import webdriver
import os
from PIL import Image as pil
import re
import pandas as pd
import time
import requests
from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 2) 클래스 생성
class Naver:
# 3) 크롬드라이버, URL 등 설정
def __init__(self, region="09"):
options = webdriver.ChromeOptions()
options.add_argument("headless")
options.add_argument("user-agent={}".format(UserAgent().chrome))
self.driver = webdriver.Chrome("/usr/local/bin/chromedriver",options=options)
url = "https://m.naver.com/history/?menu=PLACE_{}".format(region)
self.driver.get(url)
self.df = None
self.datas2 = []
self.datas3 = []
self.view = { "06" : "대구.경북", "10" : "울산.경남", "13" : "전북", "05" : "광주.전남", "16" : "충북",
"07" : "대전.세종.충남", "14" : "제주", "01" : "강원", "08" : "부산", "11" : "인천", "02" : "경기",
"09" : "서울"}
self.driver.get(url)
self.df = None
# 4) 필요한 데이터 크롤링 함수 생성
# - 네이버 우리동네 일간 베스트 컨텐츠의 제목(title), 링크(link)
# - 지역 별로 제목, 링크는 메인 홈페이지에서 크롤링 / 데이터 베이스에 지역 컬럼 생성하여 지역 구분
def crawling(self):
datas = []
for region, name in self.view.items():
url = "https://m.naver.com/history/?menu=PLACE_{}".format(region)
self.driver.get(url)
elements = self.driver.find_elements_by_css_selector(".cvr_list_item")
for element in elements:
data = ({
'title': element.find_element_by_css_selector(".cvr_info_title").text,
'link': element.find_element_by_css_selector(".cvr_li_link").get_attribute("href"),
'region' : name
})
datas.append(data)
self.df = pd.DataFrame(datas)
# 5) 블로그 내부 크롤링하는 함수 추가
# - 좋아요 갯수 및 블로그 게시일은 블로그 내부에서 크롤링
# - 날짜 및 좋아요 갯수 비어있는 포스트 들은 try, except 처리
def crawling_1(self):
for link in self.df["link"]:
url2 = "https://blog.like.naver.com/v1/search/contents?suppress_response_codes=\true&q=BLOG[{}_{}]&isDuplication=true".format(link.split('/')[-2], link.split('/')[-1])
self.driver.get(url2)
response = requests.get(url2)
try:
self.datas2.append(re.findall("\"count\":([\d]+)", response.text)[0])
except:
self.datas2.append(" ")
url3 = link
self.driver.get(url3)
try:
self.datas3.append(self.driver.find_element_by_css_selector(".blog_date").text)
except:
self.datas3.append(" ")
self.df["rank"] = self.datas2
self.df["date"] = self.datas3
return self.df
# 6) 크롬드라이버 종료 함수 생성
def close(self):
self.driver.quit()
# 7) 만들어진 data frame mysql sequal pro의 database로 저장하는 함수 생성
def save(self):
engine = create_engine("mysql://root:dss@54.180.70.47:3306/project?charset=utf8", encoding='utf-8')
self.df.to_sql(name="naver", con=engine, if_exists="append", index=True)
Writing naver.py
%%writefile setup.py
# setup.py 생성 및 설정
from setuptools import setup, find_packages
setup(
name='dss.naver',
packages=find_packages(),
include_package_data=True,
version="0.0.1",
author='Fast Campus, inc.',
author_email="yeoyeongung@gmail.com",
zip_safe=False,
)
Writing setup.py
# setup.py를 통해 만든 naver module 설치하기
!python setup.py develop
running develop running egg_info creating dss.naver.egg-info writing dss.naver.egg-info/PKG-INFO writing dependency_links to dss.naver.egg-info/dependency_links.txt writing top-level names to dss.naver.egg-info/top_level.txt writing manifest file 'dss.naver.egg-info/SOURCES.txt' reading manifest file 'dss.naver.egg-info/SOURCES.txt' writing manifest file 'dss.naver.egg-info/SOURCES.txt' running build_ext Creating /home/ubuntu/.pyenv/versions/3.6.9/envs/python3/lib/python3.6/site-packages/dss.naver.egg-link (link to .) Adding dss.naver 0.0.1 to easy-install.pth file Installed /home/ubuntu/python3/notebook/Project Processing dependencies for dss.naver==0.0.1 Finished processing dependencies for dss.naver==0.0.1
# naver 모듈이 정상적으로 설치되었는지 확인
!pip list | grep naver
dss.naver 0.0.1 /home/ubuntu/python3/notebook/Project
# naver 모듈 import
import naver as nv
# naver 클래스 객체 지정
naver = nv.Naver()
# 메인 홈페이지 데이터 크롤링 진행
naver.crawling()
# 블로그 내부 크롤링 진행(rank : 좋아요 갯수, date)
naver.crawling_1()
| link | region | title | rank | date | |
|---|---|---|---|---|---|
| 0 | https://m.blog.naver.com/daeguvisit/222090027381 | 대구.경북 | 트인 곳에서 즐기는 대구 달성현대미술제 실외전시 | 87 | 2020. 9. 15. 13:34 |
| 1 | https://m.blog.naver.com/gbnadri/222090200532 | 대구.경북 | 성큼 다가온 가을과 함께 경산 금호강변 힐링 산책 | 95 | 2020. 9. 15. 16:36 |
| 2 | https://m.blog.naver.com/gbnadri/222086506209 | 대구.경북 | 가을 하늘과 바다가 있는 포항 이가리 닻 전망대 | 120 | 2020. 9. 11. 11:58 |
| 3 | https://m.blog.naver.com/daegu_namgu/222090079611 | 대구.경북 | 예술가들의 정취를 느껴보는 대구 남구 대명공연거리 | 21 | 2020. 9. 15. 14:32 |
| 4 | https://m.blog.naver.com/andongcity00/22208865... | 대구.경북 | 비대면 여행 가기 좋은 안동 비밀의 숲 낙강물길공원 | 24 | 2020. 9. 14. 11:00 |
| 5 | https://m.blog.naver.com/ulsannuri/222089055291 | 울산.경남 | 언택트 시대에 맞춰 가기 좋은 울산의 숨은 관광지 | 43 | 2020. 9. 14. 13:39 |
| 6 | https://m.blog.naver.com/tongyeongsi/222067119893 | 울산.경남 | 새롭게 바뀐 통영 진두마을·봉암마을에서 즐기는 힐링 | 51 | 2020. 9. 14. 9:17 |
| 7 | https://m.blog.naver.com/gimhae4you/222089270500 | 울산.경남 | 소소한 일상에서 쉬어갈 수 있는 김해 생림면 마사마을 | 61 | 2020. 9. 14. 17:21 |
| 8 | https://m.blog.naver.com/miryangsi/222076860545 | 울산.경남 | 반려동물과 함께 힐링할 수 있는 밀양 뷰 맛집 카페 | 44 | 2020. 9. 10. 13:00 |
| 9 | https://m.blog.naver.com/ulsannuri/222086355798 | 울산.경남 | 반짝반짝 영롱함 끝판왕! 울산 야경 명소 5곳 추천 | 27 | 2020. 9. 11. 8:58 |
| 10 | https://m.blog.naver.com/jeonju_city/222086747546 | 전북 | 떡볶이 고수의 깊은 맛이 느껴지는 전주 터줏대감들 | 62 | 2020. 9. 14. 9:00 |
| 11 | https://m.blog.naver.com/hiksanin/222070697822 | 전북 | 익산 구룡마을 대나무숲! 호젓하고 운치 있는 명소 | 8 | 2020. 8. 25. 18:58 |
| 12 | https://m.blog.naver.com/gunsanpr/222084389748 | 전북 | 군산 물사랑공원, 가압장 부지가 새롭게 발돋움한 곳 | 28 | 2020. 9. 12. 9:00 |
| 13 | https://m.blog.naver.com/goodnamwon/222085626777 | 전북 | 사회적 거리 두고 마음은 쉬어가는 남원 가족 공원 | 21 | 2020. 9. 11. 12:20 |
| 14 | https://m.blog.naver.com/sunchang_story/222085... | 전북 | 순창 풍경 버스 타고 신선한 가을바람 쐬는 나들이 | 24 | 2020. 9. 12. 9:00 |
| 15 | https://m.blog.naver.com/gwangju_city/22208197... | 광주.전남 | 전시면 전시, 공연이면 공연! 모두 갖춰진 광주 공원 | 62 | 2020. 9. 6. 20:29 |
| 16 | https://m.blog.naver.com/1004_shinan/222086585423 | 광주.전남 | 부대낌 없이 호젓하게 만끽하는 신안 프라이빗 비치 | 41 | 2020. 9. 11. 13:31 |
| 17 | https://m.blog.naver.com/gangjingun/222086777055 | 광주.전남 | 싱싱한 수산물 사기 좋은 정겨운 강진 오감통 시장 | 26 | 2020. 9. 14. 14:00 |
| 18 | https://m.blog.naver.com/gwangyangsi/222085860417 | 광주.전남 | 백 년의 세월 동안 자연 속 자리를 지킨 광양 불암사 | 28 | 2020. 9. 13. 7:00 |
| 19 | https://m.post.naver.com/viewer/postView.nhn?v... | 광주.전남 | 담양 멋스러운 한옥 외관으로 시선을 사로잡는 맛집 | ||
| 20 | https://m.blog.naver.com/chungbuktravel/222086... | 충북 | 가을의 정취 느끼기 좋은 충청북도 가을 꽃놀이 명소 | 300 | 2020. 9. 11. 13:44 |
| 21 | https://m.blog.naver.com/okjc9671/222086594336 | 충북 | 옛 추억이 생각나는 레트로한 분위기의 제천 삼겹살 | 46 | 2020. 9. 11. 13:41 |
| 22 | https://m.blog.naver.com/wwwjpgokr/222085788455 | 충북 | 힐링 타임 가득한 증평 보강천·좌구산·에듀팜벨포레 | 9 | 2020. 9. 11. 14:02 |
| 23 | https://m.blog.naver.com/goesan-gun/222085691927 | 충북 | 괴산 자연 좋은 시골마을로 떠나는 가을여행 프로그램 | 2020. 9. 10. 15:03 | |
| 24 | https://m.blog.naver.com/wwwjpgokr/222084762635 | 충북 | 증평 율리 전경이 보이는 분위기 좋은 카페 소개해요 | 8 | 2020. 9. 9. 16:02 |
| 25 | https://m.blog.naver.com/dangjin2030/222079203387 | 대전.세종.충남 | 해 뜨고 지는 당진 왜목마을의 아름다운 풍경 소개 | 43 | 2020. 9. 3. 14:38 |
| 26 | https://m.blog.naver.com/daejeondime/222088862161 | 대전.세종.충남 | 대청호를 끼고 있는 대전 동구 오리골 마을의 풍경 | 44 | 2020. 9. 14. 11:10 |
| 27 | https://m.blog.naver.com/daejeontour/222085512937 | 대전.세종.충남 | 청명한 하늘 아래서 걷기 좋은 대전 중구 근린공원 | 27 | 2020. 9. 10. 11:38 |
| 28 | https://m.blog.naver.com/boryeongsi/222088917029 | 대전.세종.충남 | 보령 소도시 '창촌마을'로 가보는 언택트 배낭여행 | 24 | 2020. 9. 14. 14:40 |
| 29 | https://m.blog.naver.com/yuseonggu/222082137301 | 대전.세종.충남 | 대전 유성구 두부전문점에서 건강하고 푸짐한 식사 | 3 | 2020. 9. 6. 23:41 |
| 30 | https://m.post.naver.com/viewer/postView.nhn?v... | 제주 | 그저 편히 머물며 큐브 창 사이의 하늘을 감상하는 집 | ||
| 31 | https://m.blog.naver.com/happyjejudo/222087118471 | 제주 | 깨달음이라는 의미가 잘 어울리는 신성한 사라오름 | 99 | 2020. 9. 12. 9:00 |
| 32 | https://m.post.naver.com/viewer/postView.nhn?v... | 제주 | 유일하게 돌 염전의 모습이 남아 그림 같은 구엄포구 | ||
| 33 | https://m.blog.naver.com/grenni/222087158690 | 제주 | 카페 인더오조 | 20 | 2020. 9. 12. 0:59 |
| 34 | https://m.blog.naver.com/gmlfo12/222087554557 | 제주 | 음식점 매일올레돈 | 3 | 2020. 9. 12. 15:54 |
| 35 | https://m.blog.naver.com/gogw1234/222086471470 | 강원 | 해수욕이 아니라도 조용히 걷기 좋은 고성 여행 | 32 | 2020. 9. 11. 11:23 |
| 36 | https://m.blog.naver.com/wjkcr/222086612768 | 강원 | 도자기, 직접 빚어 굽는다 원주 공방 둘러보기 | 9 | 2020. 9. 11. 14:01 |
| 37 | https://m.blog.naver.com/a_0219/222074810971 | 강원 | 음식점 중화요리 홍일점 | 15 | 2020. 8. 31. 8:00 |
| 38 | https://m.blog.naver.com/pinegn/222077213691 | 강원 | 볼거리 먹거리 가득한 강릉 월화 거리 걷기 | 40 | 2020. 9. 1. 15:31 |
| 39 | https://m.post.naver.com/viewer/postView.nhn?v... | 강원 | 진짜가 나타났다! 강원의 주인공 정선 감자옹심이 | ||
| 40 | https://m.blog.naver.com/cooolbusan/222086802617 | 부산 | 특성화되고 이색적인 부산의 색다른 콘셉트 도서관 | 122 | 2020. 9. 11. 17:14 |
| 41 | https://m.blog.naver.com/humetrobusan/22208665... | 부산 | 코로나19를 극복하는 부산도시철도 마스크 자판기 | 26 | 2020. 9. 11. 14:40 |
| 42 | https://m.blog.naver.com/bepa_sns/222089168242 | 부산 | 탁 트인 전망의 도심 속 옥상 정원 '상상마당 부산' | 25 | 2020. 9. 14. 15:38 |
| 43 | https://m.blog.naver.com/chunsikandmi/22206711... | 부산 | 음식점 쉐프한자작요리 | 15 | |
| 44 | https://m.blog.naver.com/bsdonggublog/22208902... | 부산 | 따뜻한 정을 가득 느껴보는 동구 초량 전통시장 나들이 | 33 | 2020. 9. 14. 13:06 |
| 45 | https://m.post.naver.com/viewer/postView.nhn?v... | 인천 | 일상 속 힐링 스팟, 옥상정원이 있는 남동 카페 소개 | ||
| 46 | https://m.blog.naver.com/gyeyang_gu/222044963389 | 인천 | 계양산 등산 후에 한 템포 쉬어가기 좋은 카페 2곳 | 40 | 2020. 7. 29. 10:18 |
| 47 | https://m.blog.naver.com/canna1218/222087126407 | 인천 | 음식점 오로지한식 | 53 | 2020. 9. 12. 0:07 |
| 48 | https://m.blog.naver.com/playganghwa/222089240350 | 인천 | 강화성당이 주는 전통 한옥과 서양식 건축양식의 조화 | 28 | 2020. 9. 14. 16:52 |
| 49 | https://m.blog.naver.com/incheontogi/222085720997 | 인천 | 인천 관광 부흥 기대, 다시 달리는 꼬마열차 '수인선' | 98 | 2020. 9. 10. 15:34 |
| 50 | https://m.blog.naver.com/letsgoyang/222079326463 | 경기 | 고양 백석동의 유래를 파헤쳐 볼 수 있는 흰 돌 유적 | 50 | 2020. 9. 10. 16:00 |
| 51 | https://m.blog.naver.com/osan_si/222085417305 | 경기 | 문화도시 오산 금암동 걸어서 동네 한 바퀴 아카이브 | 21 | 2020. 9. 10. 9:52 |
| 52 | https://m.blog.naver.com/gmcityhall/222085779288 | 경기 | 코로나19 강하된 방역 조치와 광명 한내 근린공원 | 25 | 2020. 9. 10. 16:33 |
| 53 | https://m.blog.naver.com/zx3737/222080383441 | 경기 | 주점 히피동 | 9 | 2020. 9. 4. 18:02 |
| 54 | https://m.blog.naver.com/gyeonggi_gov/22208569... | 경기 | 연천 임진강 물길 따라 군남 홍수 조절지까지 | 84 | 2020. 9. 10. 16:00 |
| 55 | https://m.blog.naver.com/together_sh/222077143190 | 서울 | 관공서 디자인의 틀을 깨다! 서울 소방서의 변신 | 52 | 2020. 9. 1. 14:19 |
| 56 | https://m.blog.naver.com/120seoulcall/22206924... | 서울 | 잊지 말아야 할 우리 역사, 남산 기억의 터 소개해요 | 31 | 2020. 8. 24. 13:20 |
| 57 | https://m.blog.naver.com/mopaspr/222086382748 | 서울 | 과거와 현재가 공존하는 뉴트로 예술공간 '홍제유연' | 69 | 2020. 9. 11. 9:39 |
| 58 | https://m.blog.naver.com/seocho88/222075944335 | 서울 | 서초 고속 터미널 근처 산책하기 좋은 신반포공원 산책 | 2020. 8. 31. 10:35 | |
| 59 | https://m.blog.naver.com/yangcheon2016/2220844... | 서울 | 양천 일자리 카페 9월 무료 프로그램 참여자 모집 안내 | 13 | 2020. 9. 9. 10:10 |
# 데이터베이스에 저장 진행
naver.save()
Image("2.png")
# 크롬 드라이버 종료
naver.close()
!pip uninstall dss.naver -y
Found existing installation: dss.naver 0.0.1 Uninstalling dss.naver-0.0.1: Successfully uninstalled dss.naver-0.0.1
!pip list | grep naver
Image("3.png")
# project.py를 만들어 매일 동일한 시간에 데이터가 크롤링되서 my sql 데이터베이스에 저장하게끔 설정
# weekend.py를 생성하여 해당 프로그램이 실행되면 일별 컨텐츠 mysql 데이터베이스를 불러와서 point 순으로 상위 5개 컨텐츠를 슬렉으로 전송
from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
import json
import requests
import pandas as pd
import numpy as np
# 데이터베이스에서 불러와서 데이터 전처리 진행
engine = create_engine("mysql://root@15.75.559.39:3306/project?charset=utf8", encoding='utf-8')
QUERY = """
SELECT *
FROM region
"""
naver_df = pd.read_sql(QUERY, engine)
naver_dfff = naver_df.loc[naver_df["rank"] != "", :]
naver_df1 = naver_dfff.loc[naver_dfff["date"] != "", :]
naver_df1["rank"] = naver_df1["rank"].astype("int")
naver_df1.sort_values(by="rank", ascending=False, inplace=True)
naver_df1.drop_duplicates(subset="title", inplace=True, keep='first')
naver_df1 = naver_df1.loc[naver_df1["region"] == "경기",:]
datas = []
naver_df1["today"] = pd.datetime.now().date()
naver_df1["date"] = naver_df1["date"].astype('datetime64[ns]').dt.date
naver_df1["time"] = naver_df1["today"]-naver_df1["date"]
naver_df1["time"] = naver_df1["time"].astype("str").str.replace(" days 00:00:00.000000000", "").astype("int")
for i in naver_df1["time"]:
if i <= 7:
datas.append(3)
elif 7<i<=14:
datas.append(2)
elif 14<i<=21:
datas.append(1)
else:
datas.append(0)
naver_df1["time_score"] = datas
naver_df1["point"] = naver_df1["rank"]*1 + naver_df1["time_score"]*20
naver_df1.sort_values(by="point", ascending=False, inplace=True)
# 슬랙 보내기
webhook = "https://hooks.slack.com/services/T0188HDAP3L/B01979llJQ1/lXmwQf9akjJmX508pWlu450l"
payload = {
"channel":"#yong",
"username":"도도용",
"text": "===============================\n\
네이버 우리동네판 베스트 5 블로그 지역정보\n\
==============================="
}
requests.post(webhook, json.dumps(payload))
for i in np.arange(0,5):
webhook = "https://hooks.slack.com/services/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"
payload = {
"channel":"#yong",
"username":"도도용",
"text": "{} 순위 지역 : {}, 날짜 : {} \n\
{} : {}".format((i+1) ,naver_df1.iloc[i,2], naver_df1.iloc[i,4],naver_df1.iloc[i,0], naver_df1.iloc[i,1])
}
requests.post(webhook, json.dumps(payload))
# 카카오톡 보내기
user_data = {'access_token': 'RzYJvIU3ovZYqZob4PqknXLxWSdU5576oBOVrGBQo9cpgAAAF0tdDNXg',
'token_type': 'bearer',
'refresh_token': '9oPdjPEP19yCsiG_PJ5CWJyn7f-fJZ576Y3BxA7Uwo9cpgAAA77tdDNXQ',
'expires_in': 215969,
'scope': 'talk_message profile',
'refresh_token_expires_in': 51836999}
app_key = "d4149ce7884af103149baf88bd6267349"
url = "https://kapi.kakao.com/v2/api/talk/memo/default/send"
for i in np.arange(0,5):
params = {
"object_type" : "text",
"text": "{} 순위 지역 : {}, 날짜 : {} \n\
{} {}".format((i+1) ,naver_df1.iloc[i,2], naver_df1.iloc[i,4],naver_df1.iloc[i,0], naver_df1.iloc[i,1]),
"link" : {"mobile_web_url" : naver_df1.iloc[i,1],
"web_url" : naver_df1.iloc[i,1]},
"button_title" : "위 링크 클릭하세요!"
}
headers = {
"Content-Type" : "application/x-www-form-urlencoded",
"Authorization": "Bearer {}".format(user_data["access_token"])
}
payload = "template_object=" + str(json.dumps(params))
response = requests.post(url, payload, headers=headers)
response
# 데이터 전처리
Image("20.png")
# 슬랙으로 전송되는 부분 확인
Image("6.png")
# 카카오톡 메세지 전송 서비스
Image("11.jpeg")
# 1) lambda service는 크롤링 서버를 매일 오전 9:01 시작하고 9:05에 종료하게끔 설정함
# 2) 크롤링 서버 크론탭에서 project.py(일별 베스트 컨텐츠 데이터베이스에 저장)는 reboot될때마다 실행 되게끔 설정
# 3) weekend.py 일별 베스트 컨텐츠를 취합하여 좋아요 갯수 및 최근 기준으로 5개 선정하여 매주 금요일 오전 9:03에 msg 전송
Image("5.png")
# slack chatbot 모듈 생성하여 지역 입력하면 해당 지역에 맞는 베스트 컨텐츠 전송하게끔 설정
!rm -rf slack
!mkdir -p chatbot/libs
!touch slack/chatbot.py
!touch slack/libs/region.py
!touch slack/libs/slack.py
!tree slack
!mkdir -p slack/templates
!touch slack/templates/index.html
!tree slack/
slack/ ├── __pycache__ │ └── config.cpython-36.pyc ├── chatbot.py ├── config.py ├── libs │ ├── __pycache__ │ │ ├── naver.cpython-36.pyc │ │ ├── region.cpython-36.pyc │ │ └── slack.cpython-36.pyc │ ├── naver.py │ ├── region.py │ ├── slack.py │ └── weather.py └── templates └── index.html 4 directories, 11 files
# chatbot.py 생성하여 슬랙에서 원하는 지역 선정할 수 있게끔 설정
%%writefile slack/chatbot.py
import libs.slack as slack
import libs.region as region
import numpy as np
from flask import *
from config import Config
app = Flask(__name__)
app.config.update(TEMPLATES_AUTO=True, DEBUG=True)
# 서비스 사이트 접속 html 라우터 생성
@app.route("/")
def index():
return render_template("index.html")
@app.route("/blog")
def blog():
sentence = request.values.get("sentence")
rg = region.region(sentence)
datas1 = []
datas2 = []
datas3 = []
datas4 = []
for i in np.arange(0,10):
datas1.append(rg.iloc[i,0])
datas2.append(rg.iloc[i,1])
datas3.append("{} 순위".format((i+1)))
datas4.append("등록일 : {}".format(rg.iloc[i,4]))
result = {}
result["sentence"] = sentence
result["title"] = datas1
result["link"] = datas2
result["rank"] = datas3
result["date"] = datas4
return jsonify(result)
@app.route("/bot", methods=["POST"])
def bot():
username = request.form.get("user_name")
token = request.form.get("token")
text = request.form.get("text")
text = text.replace("[bot] ","")
print(username, token, text)
if text.find(":") <= 0:
msg = "........==============[bot] (블로그):(지역) 형식으로 입력하세요==================\n\
ex) [bot] 블로그:세종==============================================\n\
지역) 대구.경북,울산.경남,전북,광주.전남,충북,대전.세종.충남,제주,강원,부산,인천,경기,서울\n\
============================================================"
slack.send_msg(Config.WEBHOOK_URL, msg)
return Response(), 200
comm, data = text.split(":")[0], text.split(":")[1]
data = data.strip()
comm = comm.strip()
if comm == "블로그":
data1 = region.region(data)
for i in np.arange(0,5):
msg = "{} 순위 지역 : {}, 날짜 : {} \n\
{} : {}".format((i+1) ,data1.iloc[i,2], data1.iloc[i,4],data1.iloc[i,0], data1.iloc[i,1])
slack.send_msg(Config.WEBHOOK_URL, msg)
else:
msg = "{}은 없는 명령입니다.".format(comm)
return Response(), 200
app.run()
%%writefile slack/templates/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>DSS14</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<h3 class="my-5 text-center">지역 여행 블로그 검색기</h3>
<div class="row">
<input id="ddy" class="form-control col-md-9 sentence" type="text" placeholder="문장을 입력하세요">
<button type="button" class="btn btn-danger col-md-3 prediction">검색</button>
</div>
<div class="row my-3">
<div class="col-12 alert alert-danger" role="alert">
지역) 대구.경북,울산.경남,전북,광주.전남,충북,대전.세종.충남,제주,강원,부산,인천,경기,서울
등 지역을 검색하세요 <br>
블로그 좋아요와 게시일을 합산하여 순위를 산정했습니다.
</div>
</div>
<figure class="highcharts-figure">
<div id="container"></div>
</figure>
</div>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
function search(sentence){
// 서버 api로 요청
$.getJSON("/blog?sentence=" + sentence, function(datas){
console.log(datas);
// html로 write
$(".alert").empty();
for(var i=0; i < datas.title.length ; i++){
console.log(datas.rank[i], datas.title[i], datas.link[i], datas.date[i]);
var tag = "<p>" + datas.rank[i] + " : " + datas.title[i] + " : <a href='" + datas.link[i] + "' target='_blank'>" + datas.link[i] + "</a>" + " " + datas.date[i] + "</p>";
// var tag = "<p>" + datas.rank[i] + " : " + datas.title[i] + datas.link[i] + "</p>";
console.log(tag);
$(".alert").append(tag);
}
})
}
console.log("init");
$("#ddy").keydown(function(key){if(key.keyCode==13){
// 문장 읽어오기
var sentence = $(".sentence").val();
console.log(sentence);
search(sentence)
}})
// 버튼 클릭
$(".prediction").on("click", function(){
// 문장 읽어오기
var sentence = $(".sentence").val();
console.log(sentence);
search(sentence)
})
})
</script>
</body>
</html>
# 입력받은 지역에 맞는 베스트 컨텐츠 slack 메세지로 전송하기
%%writefile slack/libs/slack.py
import requests, json
def send_msg(webhook_url, msg, channel="#dss14th", username="네이버 블로그봇"):
payload = {'channel': channel, "username":username, "text": msg}
requests.post(webhook_url, data=json.dumps(payload))
Overwriting slack/libs/slack.py
# 슬랙봇으로 지역 입력 시, 네이버 블로그 봇이 베스트 컨텐츠 답변
Image("21.png")
# html 홈페이지 구성하여 서비스 구현
# http://dodoyong.tk
Image("crawling03.png")
!jupyter nbconvert --to html crawling_final_announce.ipynb
[NbConvertApp] Converting notebook crawling_final_announce.ipynb to html [NbConvertApp] Writing 4303557 bytes to crawling_final_announce.html